package com.dshore.messagecenter.quartz.dataStat;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.dshore.messagecenter.util.RabbitUtil;
import com.dshore.messagecenter.util.UUIDUtil;
import com.rabbitmq.http.client.domain.NodeInfo;
import com.rabbitmq.http.client.domain.QueueInfo;

@Component
public class RabbitInfoStat {
	
	@Autowired
	private RabbitUtil rabbitUtil;

	// 节点信息列表
	private List<NodeInfo> nodes;
	// 队列信息列表
	private List<QueueInfo> queues;
	// 统计信息列表
	private List<Object[]> records = new ArrayList<Object[]>();
	
	/**
	 * 获取rabbitmq监控信息
	 * @return
	 */
	public List<Object[]> getCurrentRabbitMonitor() {
		// 获取所有节点信息
		nodes = rabbitUtil.getClient().getNodes();
		// 获取所有queue信息
		queues = rabbitUtil.getClient().getQueues();

		// 清空统计信息列表
		records.clear();
		
		// 总消息堆积条数
		long wholeMsgStoreNum = 0;
		// 总内存占用
		float wholeMemoryUsed = 0;
		// 总磁盘剩余空间
		float wholeDiskFree = 0;
		// 当前时间
		Date now = new Date();
		
		// 将挂起时间转为北京时间
		SimpleDateFormat sdfBeijing = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		sdfBeijing.setTimeZone(TimeZone.getTimeZone("Asia/ShangHai"));
		// 将转后的时间转为String
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		// 循环主题队列列表，与map匹配，Hashmap的效率匹配的效率高于嵌套for循环
		for (QueueInfo queue : queues) {
			// 记录总消息堆积量
			wholeMsgStoreNum += queue.getMessagesReady();

//			// 记录单个主题队列消息堆积
//			records.add(new Object[]{UUIDUtil.getUUId(), "消息堆积量", queue.getMessagesReady(), "队列", queue.getName(), now, now});
//			// 记录单个主题队列消息堆积
//			records.add(new Object[]{UUIDUtil.getUUId(), "内存占用", queue.getMemoryUsed(), "队列", queue.getName(), now, now});
//			// 记录单个主题队列消息堆积
//			records.add(new Object[]{UUIDUtil.getUUId(), "磁盘读取", queue.getDiskReads(), "队列", queue.getName(), now, now});
//			// 记录单个主题队列消息堆积
//			records.add(new Object[]{UUIDUtil.getUUId(), "磁盘写入", queue.getDiskWrites(), "队列", queue.getName(), now, now});
//			// 记录单个主题队列消息堆积
//			if (queue.getIdleSince() != null) {
//				try {
//					records.add(new Object[]{UUIDUtil.getUUId(), "队列挂起时间", sdf.format(sdfBeijing.parse(queue.getIdleSince())), "队列", queue.getName(), now, now});
//				} catch (ParseException e) {
//					e.printStackTrace();
//				}
//			}
		}
		
		// 记录总消息堆积
		records.add(new Object[]{UUIDUtil.getUUId(), "消息堆积量", wholeMsgStoreNum, "消息队列", "RabbitMQ", now, now});
		
		// 遍历所有节点，汇总内存占用和磁盘剩余空间
		for (NodeInfo node : nodes) {
			wholeMemoryUsed += node.getMemoryUsed();
			wholeDiskFree += node.getDiskFree();
		}
		// 记录内存占用信息,转为GB
		records.add(new Object[]{UUIDUtil.getUUId(), "内存占用", wholeMemoryUsed, "消息队列", "RabbitMQ", now, now});
		// 记录磁盘剩余空间信息,转为GB
		records.add(new Object[]{UUIDUtil.getUUId(), "磁盘剩余空间", wholeDiskFree, "消息队列", "RabbitMQ", now, now});
		
		return records;
	}
}
